import { Module } from 'vuex'
import { ILoginState } from './types'
import { IRootState } from '../types'
import { accountLoginRequest, reqLoginUserInfo, reqUserMenus, testReq } from '@/serivce/login/login'
import { IAccount, IDataType, ISpringSecurityLoginResult, ISpringSecurityLoginUserModel } from '@/serivce/login/types'
import localCache from '@/utils/cache'
import router from '@/router'
import { mapMenus2Routes, mapMenusToPermissions } from '@/utils/map-menus'
import { RouteRecordRaw } from 'vue-router'

const loginModule: Module<ILoginState, IRootState> = {
  namespaced: true,
  state() {
    return {
      token: '',
      userInfo: {},
      userMenus: []
    }
  },
  mutations: {
    changeToken(state, token: string) {
      // 只能通过 mutation 修改 state 的值
      state.token = token
    },
    changeUserInfo(state, userInfo: any) {
      state.userInfo = userInfo
    },
    changeUserMenus(state, userMenus: any) {
      state.userMenus = userMenus

      const mainChildrenRoutes: RouteRecordRaw[] = mapMenus2Routes(userMenus)
      // console.log('用户拥有权限对应的路由：', mainChildrenRoutes)
      // 遍历添加路由
      mainChildrenRoutes.forEach((item) => {
        router.addRoute('main', item)
      })

      // 根据用户菜单权限构建拥有的权限
      const permissions = mapMenusToPermissions(userMenus)
      console.log('srcstoreloginlogin.ts#changeUserMenus', permissions)
    }
  },
  actions: {
    async accountLoginAction({ commit }, payload: ISpringSecurityLoginUserModel) {
      // 使用传入的登录账号信息发送登录请求
      console.log('登录请求发送的参数：', payload)
      const loginResult: IDataType<ISpringSecurityLoginResult> = await accountLoginRequest(payload)
      // 2021年9月22日 16:24:41 chanchaw
      // 后端服务 atools 使用了 SpringSecurity，登录成功的话会返回 authentication.getPrincipal()
      // 由于使用了统一返回接口，该数据是包裹在 JsonResult 对象的 data 属性下的
      // 返回的完整的数据结构如下：
      // {
      //   "code": 1,
      //   "msg": "成功",
      //   "data": {
      //       "sysUser": {
      //           "iid": 2,
      //           "userid": "1002",
      //           "username": "陈超",
      //           "password": "0459f8ebb506c02718d4b29b11f586a0",
      //           "remark": "7758",
      //           "non_locked": true,
      //           "non_expired": true,
      //           "non_password_expired": true,
      //           "status": 1,
      //           "last_time": "2019-11-28 12:57:09",
      //           "create_time": "2019-11-28 12:57:09",
      //           "role_iids": "3,1",
      //           "role_sids": "职员,经理"
      //       },
      //       "authorities": [
      //           {
      //               "authority": "ccViewPK"
      //           },
      //           {
      //               "authority": "ccViewAll"
      //           },
      //           {
      //               "authority": "ccNew"
      //           },
      //           {
      //               "authority": "ccUpdate"
      //           },
      //           {
      //               "authority": "ccDelete"
      //           }
      //       ],
      //       "username": "2",
      //       "enabled": true,
      //       "password": "0459f8ebb506c02718d4b29b11f586a0",
      //       "accountNonExpired": true,
      //       "accountNonLocked": true,
      //       "credentialsNonExpired": true
      //   }
      // }

      // 以用户密码作为 token
      const userPK = loginResult.data.sysUser.iid
      const token = loginResult.data.sysUser.password

      // 更新 state ，缓存 token
      commit('changeToken', token) // 通过调用 mutation 修改 state 的值
      localCache.setCache('token', token)

      // 登录成功后请求用户信息并更新 state，缓存用户信息
      const userInfoResult = await reqLoginUserInfo(userPK)
      const userInfo = userInfoResult.data
      commit('changeUserInfo', userInfo)
      localCache.setCache('userInfo', userInfo)

      // 请求用户菜单并更新 state，缓存到 localStorage
      // 下面硬编码传入用户的主键2，查询获取指定的菜单项
      const userMenusResult = await reqUserMenus(2)
      const userMenus = userMenusResult.data
      console.log('登录后获取的用户菜单是：', userMenus)
      //  2021年9月23日 10:35:50 chanchaw
      // 响应来的菜单数据结构见 D:\vue\vue3-ts-cms\doc\数据结构.md
      // 中的菜单数据结构，注意使用时要去掉 root 节点，使用
      commit('changeUserMenus', userMenus)
      localCache.setCache('userMenus', userMenus)

      // 跳转到首页
      router.push('/main')
    },

    loadLocalLogin({ commit }) {
      const token = localCache.getCache('token')
      if (token) {
        console.log('从本地缓存更新 token 到 vuex：', token)
        commit('changeToken', token)
      }

      const userInfo = localCache.getCache('userInfo')
      if (userInfo) {
        console.log('从本地缓存更新 userInfo 到 vuex：', userInfo)
        commit('changeUserInfo', userInfo)
      }

      const userMenus = localCache.getCache('userMenus')
      if (userMenus) {
        console.log('从本地缓存更新 userMenus 到 vuex：', userMenus)
        commit('changeUserMenus', userMenus)
      }
    }
  }
}

export default loginModule
